#include <iostream>
#include <cstdio>
#include <string>
#include <unistd.h>
#include <pthread.h>

int flag = 100;

void showtid(pthread_t &tid)
{
    printf("tid: 0x%lx\n", tid);
}

std::string FormatId(const pthread_t &tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}
// code done, result ok
// code done, result not ok
// code no finish
void *routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    pthread_t tid = pthread_self();
    int cnt = 5;
    while (cnt)
    {
        std::cout << "我是一个新线程: 我的名字是: " << name << " 我的Id是: " << FormatId(tid) << std::endl;
        sleep(1);
        cnt--;
        flag++;
    }
    return (void*)123;// 暂时：线程退出的时候的退出码
}

int main()
{
    pthread_t tid;
    int n = pthread_create(&tid, nullptr, routine, (void *)"thread-1");

    showtid(tid);

    int cnt = 5;
    while (cnt)
    {
        std::cout << "我是main线程: 我的名字是: main thread" << " 我的Id是: " 
            << FormatId(pthread_self()) << ", flag: " << flag << std::endl;
        sleep(1);
        cnt--;
    }

    void *ret = nullptr; // ret也是一个变量！！也有空间哦！

    // 等待的目标线程，如果异常了，整个进程都退出了，包括main线程，所以，join异常，没有意义，看也看不到！
    // jion都是基于：线程健康跑完的情况，不需要处理异常信号，异常信号，是进程要处理的话题！！！
    pthread_join(tid, &ret); // 为什么在join的时候，没有见到异常相关的字段呢？？

    std::cout << "ret is : " << (long long int)ret << std::endl;

    return 0;
}

// #include <thread>

// void hello()
// {
//     while (true)
//     {
//         std::cout << "新线程: hello world, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     std::thread t(hello);

//     while (true)
//     {
//         std::cout << "我是主线程..." << ", pid: " << getpid() << std::endl;
//         sleep(1);
//     }

//     t.join();
//     return 0;
// }

// #include <pthread.h>

// void *threadrun(void *args)
// {
//     std::string name = (const char*)args;
//     while(true)
//     {
//         sleep(1);
//         std::cout << "我是新线程: name: " << name << ", pid: " << getpid() << std::endl;
//         int a = 10;
//         a /= 0;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");

//     while(true)
//     {
//         std::cout << "我是主线程..." << ", pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
